package com.keitaitoys.fonteditor.gui.editor;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Locale;

import javax.swing.JMenuItem;

import com.keitaitoys.fonteditor.core.LocaleManager;
import com.keitaitoys.fonteditor.core.Manager;
import com.keitaitoys.fonteditor.event.LocaleChangeEvent;
import com.keitaitoys.fonteditor.event.LocaleChangeListener;
import com.keitaitoys.fonteditor.font.Symbol;

public class CharMenuItem extends JMenuItem implements LocaleChangeListener, ActionListener {

	//////////////////////////////////////////////////////////////////////
	// Description ///////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////
	// Consts ////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	private static final String CAPTION_LOCALIZE_KEY = "menuitem.char.caption";
	
	//////////////////////////////////////////////////////////////////////
	// Variables /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	private Symbol symbol;

	//////////////////////////////////////////////////////////////////////
	// Constructor ///////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	public CharMenuItem(Symbol symbol) {
		
		this.symbol = symbol;
		
		LocaleManager localeManager = LocaleManager.getInstance();
		localeManager.addLocaleChangeListener(this);

		init();
	}

	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	private void init() {
		
		setEnabled(true);

		localize();
		
		addActionListener(this);
	}

	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	public void actionPerformed(ActionEvent e) {
		
		Manager manager = Manager.getInstance();
		manager.executeSetSelected(symbol);
	}

	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	private String createHexString(String charString) {
		
		LocaleManager localeManager = LocaleManager.getInstance();
		Locale locale = localeManager.getLocale();

		String hexString = String.format("%04x", charString.codePointAt(0)); 
		
		return hexString.toUpperCase(locale);
	}

	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	private String createBlockString(String charString) {
		
		Character.UnicodeBlock block = Character.UnicodeBlock.of(charString.codePointAt(0));
		
		String unformatedBlockString = block.toString().replace('_', ' ');
		StringBuffer blockString = new StringBuffer();
		
		String[] words = unformatedBlockString.split("\\s");
		
        for(String string : words) {
        	blockString.append(createCapitalizedString(string));
        	blockString.append(" ");
        }

		return blockString.toString();
	}

	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	public static String createCapitalizedString(String string) {
    	
		LocaleManager localeManager = LocaleManager.getInstance();
		Locale locale = localeManager.getLocale();

		if(string.length() > 0) {
			string = string.substring(0, 1).toUpperCase(locale) + string.substring(1).toLowerCase(locale);
		}
		
		return string;
    }

	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	private void localize() {
		
		LocaleManager localeManager = LocaleManager.getInstance();

		char c = symbol.getChar();
		String hexString = "";
		String blockString = "";

		String charString = String.valueOf(c);

		if(charString.length() > 0) {
			
			hexString = createHexString(charString);
			blockString = createBlockString(charString);
		}
		
		setText(localeManager.getValue(CAPTION_LOCALIZE_KEY, c, hexString, blockString));
	}
	
	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	public void localeChange(LocaleChangeEvent e) {
		
		localize();
	}
}
